// Function Overloading (函数重载) 示例
// 演示 Pascal 中函数重载的用法
program p_13_function_overloading;

{$mode objfpc}{$H+}
// {$mode objfpc} 启用 Object Pascal 模式，支持函数重载
// {$H+} 启用长字符串支持（AnsiString）

// 引入单元文件
uses
  SysUtils;  // 系统工具单元，包含常用的系统函数

// 1. 函数重载 - 不同参数类型（计算两个数的最大值）
function Max(a, b: Integer): Integer;
begin
  if a > b then
    Max := a
  else
    Max := b;
end;

function Max(a, b: Real): Real;
begin
  if a > b then
    Max := a
  else
    Max := b;
end;

// 2. 函数重载 - 不同参数数量（计算两个或三个数的最大值）
function Max(a, b, c: Integer): Integer;
begin
  Max := Max(Max(a, b), c);  // 调用两个参数的Max函数
end;

// 3. 过程重载 - 不同参数类型（显示信息）
procedure Display(value: Integer);
begin
  WriteLn('整数: ', value);
end;

procedure Display(value: Real);
begin
  WriteLn('实数: ', value:0:2);
end;

procedure Display(value: String);
begin
  WriteLn('字符串: ', value);
end;

// 4. 过程重载 - 不同参数数量（显示坐标点）
procedure DisplayPoint(x, y: Integer);
begin
  WriteLn('整数坐标点: (', x, ', ', y, ')');
end;

procedure DisplayPoint(x, y, z: Integer);
begin
  WriteLn('整数坐标点: (', x, ', ', y, ', ', z, ')');
end;

// 5. 函数重载 - 处理数组
function Sum(arr: array of Integer; size: Integer): Integer;
var
  i, total: Integer;
begin
  total := 0;
  for i := 0 to size - 1 do
    total := total + arr[i];
  Sum := total;
end;

function Sum(arr: array of Real; size: Integer): Real;
var
  i: Integer;
  total: Real;
begin
  total := 0;
  for i := 0 to size - 1 do
    total := total + arr[i];
  Sum := total;
end;

// 所有变量声明移到这里
var
  intMax: Integer;
  realMax: Real;
  maxOfTwo: Integer;
  maxOfThree: Integer;
  intArray: array[0..4] of Integer;
  realArray: array[0..4] of Real;
  i: Integer;

// 程序主入口
begin
  WriteLn('=== Pascal 函数重载示例 ===');
  WriteLn;
  
  // 1. 调用不同参数类型的重载函数
  WriteLn('1. 调用不同参数类型的重载函数:');
  intMax := Max(15, 25);
  WriteLn('  Max(15, 25) = ', intMax);
  
  realMax := Max(3.14, 2.71);
  WriteLn('  Max(3.14, 2.71) = ', realMax:0:2);
  
  WriteLn;
  
  // 2. 调用不同参数数量的重载函数
  WriteLn('2. 调用不同参数数量的重载函数:');
  maxOfTwo := Max(10, 20);
  WriteLn('  Max(10, 20) = ', maxOfTwo);
  
  maxOfThree := Max(10, 20, 30);
  WriteLn('  Max(10, 20, 30) = ', maxOfThree);
  
  WriteLn;
  
  // 3. 调用不同参数类型的重载过程
  WriteLn('3. 调用不同参数类型的重载过程:');
  Display(42);
  Display(3.14159);
  Display('Hello Pascal!');
  
  WriteLn;
  
  // 4. 调用不同参数数量的重载过程
  WriteLn('4. 调用不同参数数量的重载过程:');
  DisplayPoint(5, 10);
  DisplayPoint(1, 2, 3);
  
  WriteLn;
  
  // 5. 调用处理数组的重载函数
  WriteLn('5. 调用处理数组的重载函数:');
  intArray[0] := 1;
  intArray[1] := 2;
  intArray[2] := 3;
  intArray[3] := 4;
  intArray[4] := 5;
  
  realArray[0] := 1.1;
  realArray[1] := 2.2;
  realArray[2] := 3.3;
  realArray[3] := 4.4;
  realArray[4] := 5.5;
  
  WriteLn('  整数数组元素:');
  for i := 0 to 4 do
    Write(intArray[i], ' ');
  WriteLn;
  WriteLn('  整数数组之和: ', Sum(intArray, 5));
  
  WriteLn('  实数数组元素:');
  for i := 0 to 4 do
    Write(realArray[i]:0:1, ' ');
  WriteLn;
  WriteLn('  实数数组之和: ', Sum(realArray, 5):0:2);
  
  WriteLn;
  WriteLn('演示了 Pascal 中函数重载的用法');
  
  // 等待用户按键，防止程序窗口立即关闭
  ReadLn;
end.